/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package vue;

import application.GestionArtistesController;
import java.awt.Dimension;
import javax.swing.JFrame;
import java.awt.GridBagLayout;
import javax.swing.JTextField;
import java.awt.GridBagConstraints;
import java.awt.Insets;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import media.Auteur;
import media.MediaAuteur;

/**
 * Classe permettant de gérer les ajout et suppression d'auteurs
 * pour certains types de médias
 * @author Florian Minin & Khémon Beh
 */
public class VueGestionAuteur extends JFrame {

    public final static String CREER_AUTEUR = "Creer Auteur";
    public final static String AJOUTER = "Ajouter";
    public final static String RETIRER = "Retirer";
    public final static String ENREGISTRER = "Enregistrer";
    
    private JTextField txtNom;
    private JTextField txtPrenom;
    private JScrollPane jsp_ArtistesEnregistres;
    private JScrollPane jsp_ArtistesMedia;
    private JButton btnCreerNouvelAuteur;
    private JButton btnAjouter;
    private JButton btnRetirer;
    private JButton btnEnregistrer;
    private JLabel lbl_ArtistesEnregistres;
    private JLabel lbl_ArtistesMedia;
    private JTable jt_ArtistesMedia;
    private JTable jt_ArtistesEnregistres;

    /**
     * Constructeur de la vue
     */
    public VueGestionAuteur() {
        initComponents();
    }

    /**
     * Procédure qui va mettre en place la vue
     */
    private void initComponents() {
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        setTitle("Gestion des auteurs");
        GridBagLayout gridBagLayout = new GridBagLayout();
        gridBagLayout.columnWidths = new int[]{0, 0, 122, 0, 102, 0, 0, 0};
        gridBagLayout.rowHeights = new int[]{0, 0, 0, 0, 0, 0, 0, 0, 0};
        gridBagLayout.columnWeights = new double[]{0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, Double.MIN_VALUE};
        gridBagLayout.rowWeights = new double[]{0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, Double.MIN_VALUE};
        getContentPane().setLayout(gridBagLayout);

        JLabel lblNom = new JLabel("Nom");
        GridBagConstraints gbc_lblNom = new GridBagConstraints();
        gbc_lblNom.insets = new Insets(0, 0, 5, 5);
        gbc_lblNom.anchor = GridBagConstraints.EAST;
        gbc_lblNom.gridx = 1;
        gbc_lblNom.gridy = 1;
        getContentPane().add(lblNom, gbc_lblNom);

        txtNom = new JTextField();
        GridBagConstraints gbc_txtNom = new GridBagConstraints();
        gbc_txtNom.insets = new Insets(0, 0, 5, 5);
        gbc_txtNom.fill = GridBagConstraints.HORIZONTAL;
        gbc_txtNom.gridx = 2;
        gbc_txtNom.gridy = 1;
        getContentPane().add(txtNom, gbc_txtNom);
        txtNom.setColumns(10);

        JLabel lblPrenom = new JLabel("Prenom");
        GridBagConstraints gbc_lblPrenom = new GridBagConstraints();
        gbc_lblPrenom.insets = new Insets(0, 0, 5, 5);
        gbc_lblPrenom.anchor = GridBagConstraints.EAST;
        gbc_lblPrenom.gridx = 3;
        gbc_lblPrenom.gridy = 1;
        getContentPane().add(lblPrenom, gbc_lblPrenom);

        txtPrenom = new JTextField();
        GridBagConstraints gbc_txtPrenom = new GridBagConstraints();
        gbc_txtPrenom.insets = new Insets(0, 0, 5, 5);
        gbc_txtPrenom.fill = GridBagConstraints.HORIZONTAL;
        gbc_txtPrenom.gridx = 4;
        gbc_txtPrenom.gridy = 1;
        getContentPane().add(txtPrenom, gbc_txtPrenom);
        txtPrenom.setColumns(10);

        btnCreerNouvelAuteur = new JButton("Creer nouvel auteur");
        GridBagConstraints gbc_btnCreerNouvelAuteur = new GridBagConstraints();
        gbc_btnCreerNouvelAuteur.insets = new Insets(0, 0, 5, 5);
        gbc_btnCreerNouvelAuteur.gridx = 5;
        gbc_btnCreerNouvelAuteur.gridy = 1;
        getContentPane().add(btnCreerNouvelAuteur, gbc_btnCreerNouvelAuteur);

        lbl_ArtistesEnregistres = new JLabel("Artistes Enregistrés");
        GridBagConstraints gbc_lblNewLabel = new GridBagConstraints();
        gbc_lblNewLabel.gridwidth = 2;
        gbc_lblNewLabel.insets = new Insets(0, 0, 5, 5);
        gbc_lblNewLabel.gridx = 1;
        gbc_lblNewLabel.gridy = 3;
        getContentPane().add(lbl_ArtistesEnregistres, gbc_lblNewLabel);

        lbl_ArtistesMedia = new JLabel("Artistes du média");
        GridBagConstraints gbc_lblNewLabel_1 = new GridBagConstraints();
        gbc_lblNewLabel_1.insets = new Insets(0, 0, 5, 5);
        gbc_lblNewLabel_1.gridx = 5;
        gbc_lblNewLabel_1.gridy = 3;
        getContentPane().add(lbl_ArtistesMedia, gbc_lblNewLabel_1);

        jsp_ArtistesEnregistres = new JScrollPane();
        GridBagConstraints gbc_jsp_ArtistesEnregistres = new GridBagConstraints();
        gbc_jsp_ArtistesEnregistres.gridheight = 2;
        gbc_jsp_ArtistesEnregistres.gridwidth = 2;
        gbc_jsp_ArtistesEnregistres.insets = new Insets(0, 0, 5, 5);
        gbc_jsp_ArtistesEnregistres.fill = GridBagConstraints.BOTH;
        gbc_jsp_ArtistesEnregistres.gridx = 1;
        gbc_jsp_ArtistesEnregistres.gridy = 4;
        getContentPane().add(jsp_ArtistesEnregistres, gbc_jsp_ArtistesEnregistres);

        jt_ArtistesEnregistres = new JTable();
        TableModele<Auteur> modele = new TableModelAuteur<Auteur>();
        jt_ArtistesEnregistres.setModel(modele);
        jsp_ArtistesEnregistres.setViewportView(jt_ArtistesEnregistres);

        btnAjouter = new JButton("->");
        GridBagConstraints gbc_btnAjouter = new GridBagConstraints();
        gbc_btnAjouter.gridwidth = 2;
        gbc_btnAjouter.insets = new Insets(0, 0, 5, 5);
        gbc_btnAjouter.gridx = 3;
        gbc_btnAjouter.gridy = 4;
        getContentPane().add(btnAjouter, gbc_btnAjouter);

        jsp_ArtistesMedia = new JScrollPane();
        GridBagConstraints gbc_jsp_ArtistesMedia = new GridBagConstraints();
        gbc_jsp_ArtistesMedia.gridheight = 2;
        gbc_jsp_ArtistesMedia.insets = new Insets(0, 0, 5, 5);
        gbc_jsp_ArtistesMedia.fill = GridBagConstraints.BOTH;
        gbc_jsp_ArtistesMedia.gridx = 5;
        gbc_jsp_ArtistesMedia.gridy = 4;
        getContentPane().add(jsp_ArtistesMedia, gbc_jsp_ArtistesMedia);

        jt_ArtistesMedia = new JTable();
        TableModele<Auteur> modeleMedia = new TableModelAuteur<Auteur>();
        jt_ArtistesMedia.setModel(modeleMedia);
        jsp_ArtistesMedia.setViewportView(jt_ArtistesMedia);

        btnRetirer = new JButton("<-");
        GridBagConstraints gbc_btnRetirer = new GridBagConstraints();
        gbc_btnRetirer.gridwidth = 2;
        gbc_btnRetirer.insets = new Insets(0, 0, 5, 5);
        gbc_btnRetirer.gridx = 3;
        gbc_btnRetirer.gridy = 5;
        getContentPane().add(btnRetirer, gbc_btnRetirer);

        btnEnregistrer = new JButton("Enregistrer");
        GridBagConstraints gbc_btnEnregistrer = new GridBagConstraints();
        gbc_btnEnregistrer.gridwidth = 2;
        gbc_btnEnregistrer.insets = new Insets(0, 0, 5, 5);
        gbc_btnEnregistrer.gridx = 3;
        gbc_btnEnregistrer.gridy = 6;
        getContentPane().add(btnEnregistrer, gbc_btnEnregistrer);
        setSize(new Dimension(792, 559));
        setResizable(true);

        btnCreerNouvelAuteur.setActionCommand(CREER_AUTEUR);
        btnAjouter.setActionCommand(AJOUTER);
        btnRetirer.setActionCommand(RETIRER);
        btnEnregistrer.setActionCommand(ENREGISTRER);
    }

    /**
     * Permet d'effectuer l'abonnement des composant de la vue
     * @param ctrl Controller qui va effectuer les traitements
     */
    public void abonnerComponents(GestionArtistesController ctrl) {
        btnAjouter.addActionListener(ctrl);
        btnCreerNouvelAuteur.addActionListener(ctrl);
        btnRetirer.addActionListener(ctrl);
        btnEnregistrer.addActionListener(ctrl);
    }

    /**
     * Retourne l'auteur saisi par l'utilisateur
     * @return <tt>Auteur</tt> correspondaant a l'auteur saisi
     */
    public Auteur getAuteurSaisi() {
        //Un auteur peut ne pas avoir de prénom
        if (txtNom.getText().isEmpty()) {
            return null;
        }
        //On retourne un nouvel auteur
        return new Auteur(txtNom.getText(), txtPrenom.getText());
    }

    /**
     * Procédure qui va mettre a jour les liste d'auteurs de la fenêtre
     * @param listeAuteursEnregistres Ensemble des auteurs d'un type de média
     * @param media Média qui va permettre d'afficher les auteurs associé a ce média
     */
    public void majListeAuteurs(List<Auteur> listeAuteursEnregistres, MediaAuteur media) {
        //Création du modèle a partir des Auteurs du média
        TableModele<Auteur> modele = new TableModelAuteur<Auteur>(media.getListeAuteurs());
        //On modifie le modèle de la table
        jt_ArtistesMedia.setModel(modele);
        //On met a jour la liste des auteurs enregistres
        majListeAuteursEnregistres(listeAuteursEnregistres);
    }

    /**
     * Ajoute l'auteurs selectionne a la liste des auteurs du média
     */
    public void ajouterAuteurSelectionne() {
        //Si un auteur est selection du cotés des auteurs enregistrés
        if (auteurEnregistreEstSelectionne()) {
            //Récupération des modèles
            TableModelAuteur<Auteur> modele = (TableModelAuteur<Auteur>) jt_ArtistesEnregistres.getModel();
            TableModelAuteur<Auteur> modeleCible = (TableModelAuteur<Auteur>) jt_ArtistesMedia.getModel();
            //On récupére l'auteur selectionné
            Auteur auteur = modele.getObjetSelectionne(jt_ArtistesEnregistres.getSelectedRow());
            //Si l'auteur n'est pas déja dans la liste des auteurs du média
            if (!modeleCible.auteurExiste(auteur)) {
                //On l'ajoute
                modeleCible.ajouterAuteur(auteur);
            }
        }
    }

    /**
     * Retire l'auteur de la liste des auteurs du média
     */
    public void retirerAuteurSelectionne() {
        //Si un auteur associé au média est selectionné
        if (isLigneSelectionneMedia()) {
            TableModelAuteur<Auteur> modele = (TableModelAuteur<Auteur>) jt_ArtistesMedia.getModel();
            //On le supprime de la table
            modele.retirerAuteur(modele.getObjetSelectionne(jt_ArtistesMedia.getSelectedRow()));
        }
    }

    /**
     * Verifie si un auteur est selectionné dans la table des auteurs enregistrés
     * @return <tt>true</tt> si un auteur est selectionné.<tt>False</tt> sinon.
     */
    public boolean auteurEnregistreEstSelectionne() {
        if (jt_ArtistesEnregistres.getSelectedColumnCount() == 0) {
            return false;
        } else {
            return true;
        }
    }

    /**
     * Vérifie si un auteur est selectionné dans la table des auteurs du média
     * @return <tt>true</tt> si un auteur est selectionné.<tt>False</tt> sinon.
     */
    public boolean isLigneSelectionneMedia() {
        if (jt_ArtistesMedia.getSelectedColumnCount() == 0) {
            return false;
        } else {
            return true;
        }
    }

    /**
     * Charge la liste des auteurs passés en paramètre dans la table
     * @param listeAuteur Liste d'auteurs a charger dans la table
     */
    public void majListeAuteursEnregistres(List<Auteur> listeAuteur) {
        TableModelAuteur modele = new TableModelAuteur<Auteur>(listeAuteur);
        jt_ArtistesEnregistres.setModel(modele);
    }

    /**
     * Retourne l'ensemble des auteurs associé au média
     * @return une liste d'auteurs
     */
    public List<Auteur> getAuteursMedia(){
        TableModelAuteur modele = (TableModelAuteur)jt_ArtistesMedia.getModel();
        return modele.getDonnees();
    }
}
